import java.util.Scanner;

public class day2 {
    /**
     * 经典校招题
     * https://ac.nowcoder.com/acm/contest/110696/A
     */
    public static void main4(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        // 先进行计算，达到 n这个台阶时，走2台阶的次数
        int a2 = n / 2;
        // 统计剩余的台阶走一台阶走几步
        int a1 = n - a2 * 2;
        int ret = a1 + a2;
        System.out.println(ret);
    }


    /**
     * 找规律 -> 贪心
     * 非对称之美
     * https://ac.nowcoder.com/acm/problem/214851
     */
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        char[] s = in.next().toCharArray();
        int n = s.length;

        boolean flag = false;
        for(int i = 1;i < n;i++) {
            if(s[i] != s[0]) {
                // 说明不是 全部相等的字符串
                flag = true;
                break;
            }
        }
        // 这时候判断 flag 的值
        if(flag == true) {
            // 说明字符串不是全部相等的
            // 到这时候对于flag的含义就发生变化，现在为字符串本身是否为回文串
            flag = false;
            int left = 0,right = n - 1;
            while(left < right) {
                if(s[left] == s[right]) {
                    left++;
                    right--;
                }else {
                    // 表示字符串本身不是回文字符串，不是的话，直接退出
                    flag = true;
                    break;
                }
            }
            // 进行判断 flag的值
            if(flag == true) {
                // 说明字符串不是回文字符串
                System.out.println(n);
            }else {
                // 是回文字符串
                System.out.println(n - 1);
            }
        }else {
            // 说明字符串是全部相等的值，说明其非回文串的长度为0
            System.out.println(0);
        }
    }


    /**
     * 动态规划
     * DP6 连续子数组最大和(ACM版本)
     * https://www.nowcoder.com/practice/1718131e719746e9a56fb29c40cc8f95?tpId=230&tqId=39753&ru=/exam/oj
     */
    public static void main2(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] arr = new int[n + 1];
        for(int i = 1;i <= n;i++) {
            arr[i] = in.nextInt();
        }

        // dp[i]: 到达i位置后，从0~i位置的连续子数组的最大之和
        int[] dp = new int[n + 1];
        // 因为是连续的子数组，所以不会出现 选或不选
        // 如果dp[i-1]为<0 的话，那么就将其赋值为0，相当于是前面的值不进行选择，从i位置开始选
        int ret = -101;
        for(int i = 1;i <= n;i++) {
            dp[i] = Math.max(dp[i - 1],0) + arr[i];
            ret = Math.max(ret,dp[i]);
        }
        System.out.println(ret);
    }



    /**
     * 模拟
     * 经此一役小红所向无敌a
     * https://ac.nowcoder.com/acm/problem/223985
     */
    public static void main1(String[] args) {
        Scanner in = new Scanner(System.in);
        long a = in.nextLong();
        long h = in.nextLong();
        long b = in.nextLong();
        long k = in.nextLong();

        long ret = 0;
        // 1.计算当前这个可以进行进行多少回合
        long n = Math.min(h / b,k / a);
        // 计算打掉多少血，和剩余的血
        ret += n * (a + b);

        h -= n * b;
        k -= n * a;

        // 2.判断是否都还存在血，存在就可以在进行一回合
        if(h > 0 && k > 0) {
            h -= b;
            k -= a;
            ret += (a + b);
        }

        // 3.判断是否可以释放大招
        if(h > 0 || k > 0) {
            ret += 10 * (h > 0 ? a : b);
        }

        System.out.println(ret);
    }
}
